﻿using EShopV20.Areas.Adm.ActionFilters;
using EShopV20.Areas.Adm.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace EShopV20.Areas.Adm.Controllers
{
    [Security]
    public class RevenueController : Controller
    {
        EShopV20DbContext db = new EShopV20DbContext();
        //
        // GET: /Adm/Revenue/
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult byProduct()
        {
            ViewBag.Title = "Doanh số từng mặt hàng";
            ViewBag.Group = "Hàng hóa";
            var list = db.OrderDetails.GroupBy(d => d.Product).Select(
                g => new ReportInfo
                {
                    Group = g.Key.Name,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                });
            return View("Revenue", list);
        }

        public ActionResult byCategory()
        {
            ViewBag.Title = "Doanh số từng loại";
            ViewBag.Group = "Loại hàng";
            var list = db.OrderDetails.GroupBy(d => d.Product.Category).Select(
                g => new ReportInfo
                {
                    Group = g.Key.Name,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                });
            return View("Revenue", list);
        }

        public ActionResult bySupplier()
        {
            ViewBag.Title = "Doanh số từng hãng";
            ViewBag.Group = "Hãng SX";
            var list = db.OrderDetails.GroupBy(d => d.Product.Supplier).Select(
                g => new ReportInfo
                {
                    Group = g.Key.Name,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                });
            return View("Revenue", list);
        }

        public ActionResult byCustomer()
        {
            ViewBag.Title = "Doanh số từng khách hàng";
            ViewBag.Group = "Khách hàng";
            var list = db.OrderDetails.GroupBy(d => d.Order.Customer).Select(
                g => new ReportInfo
                {
                    Group = g.Key.Fullname,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                });
            return View("Revenue", list);
        }

        public ActionResult byYear()
        {
            ViewBag.Title = "Doanh số từng năm";
            ViewBag.Group = "Năm";
            var list = db.OrderDetails.GroupBy(d => d.Order.OrderDate.Year).Select(
                g => new ReportInfo
                {
                    IGroup = g.Key,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                })
                .OrderByDescending(r => r.IGroup);
            return View("Revenue", list);
        }

        public ActionResult byMonth()
        {
            ViewBag.Title = "Doanh số từng tháng";
            ViewBag.Group = "Tháng";
            var list = db.OrderDetails.GroupBy(d => d.Order.OrderDate.Month).Select(
                g => new ReportInfo
                {
                    IGroup = g.Key,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                })
                .OrderByDescending(r => r.IGroup);
            return View("Revenue", list);
        }

        public ActionResult byQuarter()
        {
            ViewBag.Title = "Doanh số từng quí";
            ViewBag.Group = "Quí";
            var list = db.OrderDetails.GroupBy(d => (int)Math.Ceiling(d.Order.OrderDate.Month / 3.0)).Select(
                g => new ReportInfo
                {
                    IGroup = g.Key,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                })
                .OrderBy(r => r.IGroup);
            return View("Revenue", list);
        }
	}
}